package com.bbva.gptf.back.dominio;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.roo.addon.dbre.RooDbManaged;
import org.springframework.roo.addon.entity.RooEntity;
import org.springframework.roo.addon.javabean.RooJavaBean;
import org.springframework.roo.addon.tostring.RooToString;

import com.bbva.jee.arq.spring.core.log.I18nLog;
import com.bbva.jee.arq.spring.core.log.I18nLogFactory;

@RooJavaBean
@RooToString
@RooDbManaged(automaticallyDelete = true)
@RooEntity(versionField = "", table = "TGPT016_CONTRATO", schema = "DBSGPT")
public class Tgpt016Contrato {
	private final static I18nLog log = I18nLogFactory
			.getLogI18n(Tgpt016Contrato.class);

	public static List<Tgpt016Contrato> obtenerContratos(
			final BigDecimal cdClasifDelta, final String cdGestor) {
		final BigDecimal stVigente = BigDecimal.ONE;
		final String qlString = "FROM Tgpt016Contrato Contrato WHERE Contrato.cdClasifDelta.cdClasifDelta = :cdClasifDelta AND "
				+ "(Contrato.cdGestor = :cdGestor OR Contrato.cdGestorRv = :cdGestor) AND "
				+ "Contrato.stVigente = :stVigente";
		return entityManager().createQuery(qlString, Tgpt016Contrato.class)
				.setParameter("cdClasifDelta", cdClasifDelta)
				.setParameter("cdGestor", cdGestor)
				.setParameter("stVigente", stVigente).getResultList();
	}

	public static List<Tgpt016Contrato> obtenerContratosMancuerna(
			final BigDecimal cdClasifDelta, final String cdBancomer,
			final String cdBancomerMancuerna) {
		final BigDecimal stVigente = BigDecimal.ONE;
		if (cdBancomerMancuerna != null) {
			final String qlString = "FROM Tgpt016Contrato Contrato WHERE Contrato.cdClasifDelta.cdClasifDelta = :cdClasifDelta AND "
					+ "(Contrato.cdGestor IN (:cdBancomer,:cdBancomerMancuerna) OR "
					+ "Contrato.cdGestorRv IN (:cdBancomer,:cdBancomerMancuerna)) AND "
					+ "Contrato.stVigente = :stVigente";
			return entityManager().createQuery(qlString, Tgpt016Contrato.class)
					.setParameter("cdClasifDelta", cdClasifDelta)
					.setParameter("cdBancomer", cdBancomer)
					.setParameter("cdBancomerMancuerna", cdBancomerMancuerna)
					.setParameter("stVigente", stVigente).getResultList();
		} else {
			final String qlString = "FROM Tgpt016Contrato Contrato WHERE Contrato.cdClasifDelta.cdClasifDelta = :cdClasifDelta AND "
					+ "(Contrato.cdGestor = :cdBancomer OR "
					+ "Contrato.cdGestorRv = :cdBancomer) AND "
					+ "Contrato.stVigente = :stVigente";
			return entityManager().createQuery(qlString, Tgpt016Contrato.class)
					.setParameter("cdClasifDelta", cdClasifDelta)
					.setParameter("cdBancomer", cdBancomer)
					.setParameter("stVigente", stVigente).getResultList();
		}
	}

	public static List<Tgpt016Contrato> obtenerContratosPorListaContrato(
			final BigDecimal cdLista) {
		final BigDecimal stVigente = BigDecimal.ONE;
		final String qlString = "from  Tgpt016Contrato contrato where "
				+ "contrato.cdContrato IN (Select detLista.cdContrato from Tgpt022DetLista detLista "
				+ " where detLista.cdLista.cdLista = :cdLista) AND "
				+ "contrato.stVigente = :stVigente";
		return entityManager().createQuery(qlString, Tgpt016Contrato.class)
				.setParameter("cdLista", cdLista)
				.setParameter("stVigente", stVigente).getResultList();
	}

	public static List<Tgpt016Contrato> obtieneContratosDisponiblesPorListaContrato(
			final BigDecimal cdClasifDelta, final String cdBancomer,
			final BigDecimal cdLista) {
		final BigDecimal stVigente = BigDecimal.ONE;
		final String qlString = "FROM Tgpt016Contrato Contrato WHERE Contrato.cdClasifDelta.cdClasifDelta = :cdClasifDelta AND "
				+ "(Contrato.cdGestor = :cdBancomer OR "
				+ "Contrato.cdGestorRv = :cdBancomer) AND "
				+ "Contrato.stVigente = :stVigente AND Contrato.cdContrato NOT IN (SELECT Detalle.cdContrato.cdContrato FROM Tgpt022DetLista Detalle WHERE Detalle.cdLista.cdLista = :cdLista)";
		return entityManager().createQuery(qlString, Tgpt016Contrato.class)
				.setParameter("cdClasifDelta", cdClasifDelta)
				.setParameter("cdBancomer", cdBancomer)
				.setParameter("cdLista", cdLista)
				.setParameter("stVigente", stVigente).getResultList();
	}

	public static List<Tgpt016Contrato> obtieneContratosPorGrupoDelta(
			final BigDecimal cdGrupoDelta, final String cdBancomer,
			String cdMancuerna) {
		if (cdGrupoDelta == null || cdBancomer == null || StringUtils.isBlank(cdBancomer)) {
			return new ArrayList<Tgpt016Contrato>();
		}
		final BigDecimal stVigente = BigDecimal.ONE;

		final StringBuffer qlString = new StringBuffer(
				"FROM Tgpt016Contrato contrato ");
		qlString.append("WHERE contrato.cdClasifDelta.cdGrupoDelta.cdGrupoDelta = :cdGrupoDelta ");
		qlString.append("AND (contrato.cdGestor IN (:cdBancomer,:cdBancomerMancuerna) ");
		qlString.append("OR contrato.cdGestorRv IN (:cdBancomer,:cdBancomerMancuerna)) AND ");
		qlString.append("contrato.stVigente = :stVigente ");

		if (cdMancuerna == null || StringUtils.isBlank(cdMancuerna)) {
			cdMancuerna = cdBancomer;
		}
		return entityManager()
				.createQuery(qlString.toString(), Tgpt016Contrato.class)
				.setParameter("cdGrupoDelta", cdGrupoDelta)
				.setParameter("cdBancomer", cdBancomer)
				.setParameter("cdBancomerMancuerna", cdMancuerna)
				.setParameter("stVigente", stVigente).getResultList();
	}

	public static BigDecimal obtieneSaldoHoy(final List<BigDecimal> contratos,
			final String tipoMercado) {
		try {
			if (contratos == null || StringUtils.isBlank(tipoMercado)) {
				return BigDecimal.ZERO;
			}
			final StringBuffer qlString = new StringBuffer("SELECT ");
			/*
			if ("MC".equalsIgnoreCase(tipoMercado)) {
				qlString.append("SUM(NVL(c.imSaldoTotal,0) * NVL(c.pcImpRv,0) ) / 100 ");
			} else {
				qlString.append("SUM(NVL(c.imSaldoTotal,0) * (100 - NVL(c.pcImpRv,0))) / 100 ");
			}
			*/
			qlString.append("SUM(NVL(c.imSaldoTotal,0)) / 100 ");
			qlString.append("FROM Tgpt016Contrato c ");
			qlString.append("WHERE c.cdContrato in (:contratos) ");
			log.info("Consulta: " + qlString.toString());
			final BigDecimal saldo = entityManager()
					.createQuery(qlString.toString(), BigDecimal.class)
					.setParameter("contratos", contratos).getSingleResult();
			return saldo != null ? saldo : BigDecimal.ZERO;
		} catch (final Exception e) {
			return BigDecimal.ZERO;
		}
	}

	public static BigDecimal obtieneSaldoTotal(
			final List<BigDecimal> contratos, final String tipoMercado) {
		try {
			if (contratos == null || StringUtils.isBlank(tipoMercado)) {
				return BigDecimal.ZERO;
			}
			final StringBuffer qlString = new StringBuffer("SELECT ");
			/*
			if ("MC".equalsIgnoreCase(tipoMercado)) {
				qlString.append("SUM(NVL(c.imSaldoTotal,0) * NVL(c.pcImpRv,0)) / 100 ");
			} else {
				qlString.append("SUM(NVL(c.imSaldoTotal,0) * (100 - NVL(c.pcImpRv,0))) / 100 ");
			}
			*/
			qlString.append("SUM(NVL(c.imSaldoTotal,0)) / 100 ");
			qlString.append("FROM Tgpt016Contrato c ");
			qlString.append("WHERE c.cdContrato in (:contratos) ");
			log.info("Consulta: " + qlString.toString());
			final BigDecimal saldo = entityManager()
					.createQuery(qlString.toString(), BigDecimal.class)
					.setParameter("contratos", contratos).getSingleResult();
			return saldo != null ? saldo : BigDecimal.ZERO;
		} catch (final Exception e) {
			return BigDecimal.ZERO;
		}
	}

	public static List<Tgpt016Contrato> obtieneContrato(
			final BigDecimal cdGrupoDelta, final String cdBancomer,
			String cdMancuerna) {
		if (cdGrupoDelta == null || cdBancomer == null || StringUtils.isBlank(cdBancomer)) {
			return new ArrayList<Tgpt016Contrato>();
		}
		final BigDecimal stVigente = BigDecimal.ONE;

		final StringBuffer qlString = new StringBuffer(
				"FROM Tgpt016Contrato contrato ");
		qlString.append("WHERE contrato.cdClasifDelta.cdGrupoDelta.cdGrupoDelta = :cdGrupoDelta ");
		qlString.append("AND (contrato.cdGestor IN (:cdBancomer,:cdBancomerMancuerna) ");
		qlString.append("OR contrato.cdGestorRv IN (:cdBancomer,:cdBancomerMancuerna)) AND ");
		qlString.append("contrato.stVigente = :stVigente ");

		if (cdMancuerna == null || StringUtils.isBlank(cdMancuerna)) {
			cdMancuerna = cdBancomer;
		}
		return entityManager()
				.createQuery(qlString.toString(), Tgpt016Contrato.class)
				.setParameter("cdGrupoDelta", cdGrupoDelta)
				.setParameter("cdBancomer", cdBancomer)
				.setParameter("cdBancomerMancuerna", cdMancuerna)
				.setParameter("stVigente", stVigente).getResultList();
	}

	public static Tgpt016Contrato findContratoByIdAndGestor(
			BigDecimal cdContrato, final String cdBancomer, String cdMancuerna) {

		final BigDecimal stVigente = BigDecimal.ONE;
		try {
			final StringBuffer qlString = new StringBuffer(
					"FROM Tgpt016Contrato contrato ");
			qlString.append("WHERE contrato.cdContrato = :cdContrato ");
			qlString.append("AND (contrato.cdGestor IN (:cdBancomer,:cdBancomerMancuerna) ");
			qlString.append("OR contrato.cdGestorRv IN (:cdBancomer,:cdBancomerMancuerna)) AND ");
			qlString.append("contrato.stVigente = :stVigente ");
			return entityManager()
					.createQuery(qlString.toString(), Tgpt016Contrato.class)
					.setParameter("cdContrato", cdContrato)
					.setParameter("cdBancomer", cdBancomer)
					.setParameter("cdBancomerMancuerna", cdMancuerna)
					.setParameter("stVigente", stVigente).getSingleResult();
		} catch (final Exception e) {
			return null;
		}
	}

	public static List<Tgpt016Contrato> obtieneContratosPorGrupoDeltaYTipoMercado(
			BigDecimal cdGrupoDelta, BigDecimal cdMercado) {

		if (cdGrupoDelta == null) {
			return new ArrayList<Tgpt016Contrato>();
		}
		final BigDecimal stVigente = BigDecimal.ONE;

		final StringBuffer qlString = new StringBuffer(
				"FROM Tgpt016Contrato contrato ");
		qlString.append("WHERE contrato.cdClasifDelta.cdGrupoDelta.cdGrupoDelta = :cdGrupoDelta ");
		qlString.append("AND contrato.stVigente = :stVigente ");
		if (cdMercado.equals(BigDecimal.ONE)) {
			qlString.append(" AND contrato.cdGestorRv IS NOT NULL ");
		} else {
			qlString.append(" AND contrato.cdGestor IS NOT NULL ");
		}
		return entityManager()
				.createQuery(qlString.toString(), Tgpt016Contrato.class)
				.setParameter("cdGrupoDelta", cdGrupoDelta)
				.setParameter("stVigente", stVigente).getResultList();
	}

	public static List<Tgpt016Contrato> obtenerContratosPorTipoMercado(
			BigDecimal cdClasifDelta, BigDecimal cdMercado) {
		final BigDecimal stVigente = BigDecimal.ONE;
		String qlString = "FROM Tgpt016Contrato Contrato WHERE Contrato.cdClasifDelta.cdClasifDelta = :cdClasifDelta AND Contrato.stVigente = :stVigente ";
		if (cdMercado.equals(BigDecimal.ONE)) {
			qlString += " AND contrato.cdGestorRv IS NOT NULL ";
		} else {
			qlString += " AND contrato.cdGestor IS NOT NULL ";
		}
		return entityManager().createQuery(qlString, Tgpt016Contrato.class)
				.setParameter("cdClasifDelta", cdClasifDelta)
				.setParameter("stVigente", stVigente).getResultList();
	}

}
